/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analisisdatos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrador
 */
public class SeparadorDatos {

    /**
     * conjunto de arhivos que hay que analizar
     */
    private ArrayList<File> archivos;
    /**
     * archivos que tienen los tweets
     */
    private ArrayList<File> archsTweets;
    /**
     * archivos que tienen los users
     */
    private ArrayList<File> archsUsers;
    /**
     * archivos que tienen la relación entre usuarios y amigos
     */
    private ArrayList<File> archsFriends;
    /**
     * arcvhivos que tienen la relacion entre usuarios y seguidores
     */
    private ArrayList<File> archsFollowers;
    /**
     * constante para diferenciar los archivos que coneitnen tweets
     */
    public final static String TWEETS = "tweets";
    /**
     * constante para diferenciar los archivos que coneitnen usuarios
     */
    public final static String USERS = "users";
    /**
     * constante para diferenciar los archivos que coneitnen seguidores
     */
    public final static String FOLLOWERS = "followers";
    /**
     * constante para diferenciar los archivos que coneitnen amigos
     */
    public final static String FRIENDS = "friends";
    /**
     * clase encargada del enriquecimiento de los datos
     */
    private Enriquecedor enriquecedor;
    /**
     * clase encargada de almacenar las entidades en la base de datos
     */
    private AlmacenadorBaseDatos almacenador;

    /**
     * guarda el arraylist con los achivos que tiene que analizar
     * @param archivos
     */
    public SeparadorDatos(ArrayList<File> archivos) throws IOException, ClassNotFoundException {
        this.archivos = archivos;

        archsFollowers = new ArrayList<File>();

        archsFriends = new ArrayList<File>();

        archsTweets = new ArrayList<File>();

        archsUsers = new ArrayList<File>();

        enriquecedor = new Enriquecedor();

        almacenador = new AlmacenadorBaseDatos();

        diferenciarArchivos();

        analizarArchivos();
        
           
        
    }

    /**
     * diferencia los archivos entre archivos de usuarios de amigos tweets y segidores
     */
    private void diferenciarArchivos() throws IOException {

        for (File file : archivos) {
            if (file.getCanonicalPath().contains(TWEETS)) {
                archsTweets.add(file);
                System.out.println("El archivo " + file.getCanonicalPath() + " es de tweets");

            }
            if (file.getCanonicalPath().contains(FRIENDS)) {
                archsFriends.add(file);
                System.out.println("El archivo " + file.getCanonicalPath() + " es de amigos");
            }

            if (file.getCanonicalPath().contains(FOLLOWERS)) {
                archsFollowers.add(file);
                System.out.println("El archivo " + file.getCanonicalPath() + " es de seguidores");
            }

            if (file.getCanonicalPath().contains(USERS)) {
                archsUsers.add(file);
                System.out.println("El archivo " + file.getCanonicalPath() + " es de usuarios");
            }

        }

        archivos.clear();
    }

    /**
     * analiza los archivos que recogió según su tipo
     */
    private void analizarArchivos() throws FileNotFoundException, IOException {

        analizarArchivosUsuarios(archsUsers);

        analizarArchivosTweets(archsTweets);

        analizarArchivosSeguidores(archsFollowers);

        analizarArchivosAmigos(archsFriends);
    }

    /**
     * lee los archivos de usuarios y los agrega correctamante a la base de datos
     * @param archsUsers
     */
    private void analizarArchivosUsuarios(ArrayList<File> archsUsers) throws FileNotFoundException, IOException {

        // crea un Arraylist de usuarios
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();

        for (File archivo : archsUsers) {
            sacarUsuarios(archivo, usuarios);
        }

       almacenador.almacenarUsuarios(usuarios);

    }

    /**
     * saca los usuarios que encuentra en el archivo que pasa por parámetro
     * <pre> el archivo debe ser un archivo de usuarios </pre>
     *
     * @param archsUsers
     */
    private void sacarUsuarios(File archivo, ArrayList<Usuario> usuarios) throws FileNotFoundException, IOException {

        BufferedReader in = sacarLector(archivo);

        String linea = in.readLine();
        // lee la primera porque esa no tiene datos
        linea = in.readLine();

        while (linea != null) {

            Usuario usNuevo = new Usuario();
            String[] partes = linea.split(";");

            /* System.out.println(linea);
            System.out.println(partes[0]);
            System.out.println(partes[1]);
            System.out.println(partes[2]);
            System.out.println(partes[3]);
            System.out.println(partes[4]);
            System.out.println(partes[5]);
            System.out.println(partes[6]);*/

            usNuevo.setId(Long.parseLong(partes[0]));
            usNuevo.setNombreUsuario(partes[1]);
            usNuevo.setUbicacion(partes[2]);
            usNuevo.setAmigosTotales(Integer.parseInt(partes[3]));
            usNuevo.setSeguidoresTotales(Integer.parseInt(partes[4]));
            usNuevo.setMensajesTotales(Integer.parseInt(partes[5]));

            usuarios.add(usNuevo);

            ////--------------------------------------------------------------
            // acá se enriquece esta entidad
            enriquecedor.enriquecerUbicacionUsuario(usNuevo);

            //almacenador.almacenarUsuario(usNuevo);

            usNuevo.imprimirUsuario();

            linea = in.readLine();
        }
    }

    /**
     * analiza los archivops que contienen Tweets
     * @param archsTweets
     */
    private void analizarArchivosTweets(ArrayList<File> archsTweets) throws FileNotFoundException, IOException {

         // crea un Arraylist de usuarios
            ArrayList<Tweet> tweets = new ArrayList<Tweet>();

        for (File file : archsTweets) {

           

            for (File archivo : archsTweets) {
                sacarTweets(archivo, tweets);
            }

        }

        almacenador.almacenarTweets(tweets);
    }

    /**
     * saca los tweets del archivo que le mandan por parámetro,
     * el archivo tiene que ser un archivo de tweets
     * @param archivo
     * @param tweets
     */
    private void sacarTweets(File archivo, ArrayList<Tweet> tweets) throws FileNotFoundException, IOException {
        BufferedReader in = sacarLector(archivo);

        String linea = in.readLine();
        // lee la primera porque esa no tiene datos
        linea = in.readLine();

        while (linea != null) {
            try {
                Tweet tweetNuevo = new Tweet();
                String[] partes = linea.split(";");
                /*System.out.println(linea);
                System.out.println(partes[0]);
                System.out.println(partes[1]);
                System.out.println(partes[2]);
                System.out.println(partes[3]);
                System.out.println(partes[4]);
                System.out.println(partes[5]);
                System.out.println(partes[6]);*/
                tweetNuevo.setFromUserId(Long.parseLong(partes[0]));
                tweetNuevo.setFromUser(partes[1]);
                tweetNuevo.setToUserId(Long.parseLong(partes[2]));
                tweetNuevo.setToUser(partes[3]);
                tweetNuevo.setTexto(partes[4]);
                tweetNuevo.setPlace(partes[5]);
                tweetNuevo.setLocation(partes[6]);

                enriquecedor.eriquecerTweet(tweetNuevo);

                //
                //Dateformat a = new Dateformat(partes[7])
                SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy");
                //Mon May 02 11:22:49 COT 2011
                tweetNuevo.setCreatedAt(sdf.parse(partes[7]));
                tweetNuevo.imprimirTweet();
                tweets.add(tweetNuevo);

               // almacenador.almacenarTweet(tweetNuevo);
                linea = in.readLine();


            } catch (ParseException ex) {
                Logger.getLogger(SeparadorDatos.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    /**
     * analiza los archivops que contienen seguidores
     * @param archsTweets
     */
    private void analizarArchivosSeguidores(ArrayList<File> archsFollowers) throws FileNotFoundException, IOException {

        // crea un Arraylist de usuarios
            ArrayList<String> parejasSeguidores = new ArrayList<String>();

        for (File file : archsFollowers) {

            
            for (File archivo : archsFollowers) {
                sacarRegistrosSeguidores(archivo, parejasSeguidores);
            }

        }

        almacenador.almacenarSeguidores(parejasSeguidores);
    }

    /**
     *  saca los registros de los segudores que le envían como parámetetro y los guarda en
     * el ArrayList
     *
     * @param archivo
     * @param parejas
     */
    private void sacarRegistrosSeguidores(File archivo, ArrayList<String> parejas) throws FileNotFoundException, IOException {
        BufferedReader in = sacarLector(archivo);

        String linea = in.readLine();
        // lee la primera porque esa no tiene datos
        linea = in.readLine();

        while (linea != null) {

            parejas.add(linea);

           // almacenador.almacenarRegistroSeguidor(linea);

            //System.out.println(linea);
            linea = in.readLine();
        }

    }

    /**
     * analiza los archivops que contienen amigos
     * @param archsTweets
     */
    private void analizarArchivosAmigos(ArrayList<File> archsAmigos) throws FileNotFoundException, IOException {

         // crea un Arraylist de usuarios
            ArrayList<String> parejasAmigos = new ArrayList<String>();

        for (File file : archsAmigos) {

           

            for (File archivo : archsAmigos) {
                sacarRegistrosAmigos(archivo, parejasAmigos);
            }

        }

        almacenador.almacenarAmigos(parejasAmigos);

    }

    /**
     * saca los registros de amigos que le llegan por parámetro y los guarda en el
     * ArrayList
     * @param archivo
     * @param parejasAmigos
     */
    private void sacarRegistrosAmigos(File archivo, ArrayList<String> parejasAmigos) throws FileNotFoundException, IOException {
        BufferedReader in = sacarLector(archivo);

        String linea = in.readLine();
        // lee la primera porque esa no tiene datos
        linea = in.readLine();

        while (linea != null) {

            parejasAmigos.add(linea);
           // almacenador.almacenarRegistroAmigos(linea);
            //System.out.println(linea);
            linea = in.readLine();
        }
    }

    private BufferedReader sacarLector(File archivo) throws FileNotFoundException {
        BufferedReader in = new BufferedReader(new FileReader(archivo));

        return in;
    }

    /**
     * @return the archivos
     */
    public ArrayList<File> getArchivos() {
        return archivos;
    }

    /**
     * @return the archsTweets
     */
    public ArrayList<File> getArchsTweets() {
        return archsTweets;
    }

    /**
     * @return the archsUsers
     */
    public ArrayList<File> getArchsUsers() {
        return archsUsers;
    }

    /**
     * @return the archsFriends
     */
    public ArrayList<File> getArchsFriends() {
        return archsFriends;
    }

    /**
     * @return the archsFollowers
     */
    public ArrayList<File> getArchsFollowers() {
        return archsFollowers;
    }


}
